Cluster API
개요
아키텍처 부분을 보면 알겠지만, 사실 이 그림은 거북이들을 거꾸로 배치시켜야 하지 않을까
클러스터 API(aka CAPI)는 클러스터에서 클러스터를 관리하는 툴이다.
선언적으로 리소스를 관리할 수 있도록 해주는 쿠버네티스의 장점을 클러스터 관리 영역에 접목시킨 기술이다.
클러스터와 관련한 커스텀 리소스를 이용하여 기본 클러스터에서 여러 작업 클러스터를 손 쉽게 구축 관리할 수 있다.
구체적으로 가지는 특징은 다음과 같다.
- 클러스터 프로비저닝, 운영에 대한 선언적 관리
- 핵심은 클러스터라는 대상을 쿠버네티스의 커스텀 리소스로 간주하여 선언적으로 관리한다는 것이다.
- 다양한 프로바이더
- 클러스터 커스텀 리소스를 등록하면 노드를 지원하는 프로바이더가 클러스터를 만드는 것을 보장해준다.
- 다양한 클라우드에서 프로바이더를 제공하고 있으며, 베어메탈 환경에서 활용할 수 있는 프로바이더 역시 존재한다.
clusterctl이라는 cli 툴을 사용하거나 오퍼레이터를 이용할 수 있다.
cli는 단순하게 배울 때 좋고, 구체적인 운영 작업에 들어갈 땐 오퍼레이터를 활용하는 것이 권장된다.
공식 문서를 보고 좀 놀랐는데, 정말 기본적인 사용법에 대한 내용은 거의 없다!
어떤 식으로 CRD를 써야 하고 어떤 것들이 있는지 자세히 안 나옴..
근데 디벨로핑 가이드 보면 레포 구조에 각 리소스 동작 원리 등의 내용이 엄청 세세하다.
아무래도 다양한 프로바이더를 위한 것으로 보이는데 아무튼 원한다면 깊게 원리를 파고들 수 있다.
아키텍처
클러스터가 클러스터를 관리하는 구조를 개략적으로 나타내면 다음과 같다.
가장 기본이 되는 클러스터는 관리 클러스터(MGMT Cluster) 라고 부른다.
이 클러스터에는 관리 대상이 되어줄 각종 클러스터에 대한 커스텀 리소스와, 실제 프로비저닝과 관리를 도와줄 컨트롤러나 프로바이더가 들어있다.
Cluster API를 운용한다는 것은 이 클러스터를 조작하는 행위를 말한다.
관리 클러스터에서 관리자가 선언적으로 리소스를 생성했다면, 해당 리소스를 토대로 실제로 클러스터를 생성하는 임무는 프로바이더가 수행한다.
(프로바이더에 대해서는 아래에서 조금 더 자세히 다룬다.)
이렇게 만들어지는 대상 클러스터를 워크로드 클러스터(Workload Cluster)라고 부른다.
여기에 번외 격으로, 관리 클러스터를 부트스트랩하기 위한 하나의 클러스터를 더 상정하기도 한다.
관리 클러스터도 명확하게 Cluster API에 기반하여 관리하기 위한 운영 전략으로, 클러스터를 클러스터로 관리한다는 Cluster API의 핵심 가치에 부합하는 방식이다.
이러한 부트스트랩 클러스터는 구축 초기에만 활용되며 관리 클러스터 구축이 완료되기 전 일시적으로 로컬 환경에서 간단하게 만들어 활용한다.
그렇기 때문에 KIND 같은 것을 간단하게 이용하는 편이다.
문서에서 권장하는 패턴은 다음과 같다.
- 활용할 프로바이더 선택
- 관리 클러스터와 워크로드 클러스터의 프로바이더는 동일하게 두는 편
- 여러 프로바이더를 사용하는 패턴도 가능하나, 동작은 보장되지 않음
- 부트스트랩용 클러스터 구축 - kind 딸깍
- 해당 클러스터에 Cluster API 컴포넌트를 배치한 후, 관리 클러스터 구축
- 관리 클러스터가 구축되면 부트스트랩 클러스터의 각종 리소스, 자원을 관리 클러스터로 마이그레이션
- 이때 관리 클러스터는 자기 자신의 상태를 관리하게 되기에 셀프 호스팅(self hosting)한다고 표현한다.
- 관리 클러스터에서 해당 자원을 이용해 자기 자신의 업그레이드, 스케일링 등에 활용할 수 있다!
- 방법 : 관리 클러스터에 프로바이더, CRD 배치 -> 사용되는 리소스 이동
- 관리 클러스터를 이용해 워크로드 클러스터 구축 및 관리
프로바이더
문서에서는 관리 클러스터에서 활용하는 간단한 커스텀 리소스 구조와 프로바이더에 대해 설명하고 있다.
Cluster API는 말 그대로 그저 API에 가깝고, 실제로 클러스터를 구축하고 조작하는 것은 각 벤더 별로 제공하는 프로바이더가 수행한다.
가령 AWS 환경에서 타겟 클러스터를 구축하고 싶다면 CAPA(Cluster Api Provider AWS)를 이용하는 식이다.
Cluster API는 클러스터를 구축하는데 필요한 개념들을 추상화시켜 벤더 종속적이지 않은 커스텀 리소스를 정의하고, 각 프로바이더가 이 리소스들을 지원할 세부 구현체 리소스를 만들도록 설계됐다.
(커스텀 리소스에 대해서는 아래에서 더 자세히 다룬다.)
다양한 프로바이더가 있을 수 있는데, 먼저 크게 3가지 종류의 프로바이더를 분류할 수 있다. 전체 리스트
- Infrastructure - 실제 인스턴스, 머신 등의 인프라 자원을 제공하는 프로바이더
- CAPG(Cluster Api Provider Google), CAPH(Cluster API Provider Hetzner), BYOH(Bring Your Own Host) ...
- Bootstrap - 인프라 자원에 인증서 세팅, 필요 컴포넌트 설치, 노드 조인 등의 동작을 지원하는 프로바이더
- CABPK(Cluster Api Bootstrap Provider Kubeadm), CABP3(Cluster API Bootstrap Provider K3s) ...
- Control plane - api 서버, 컨트롤러 매니저와 같은 컨트롤 플레인 컴포넌트를 배치해주는 프로바이더
- CACPK(Cluster Api ControlPlane Provider Kubeadm), CACP3(Cluster Api ControlPlane Provider K3s) ...
K0s처럼 모든 종류의 프로바이더를 전부 지원하는 케이스도 있으나, 대체로 인프라 프로바이더가 가장 많다.
부트스트랩, 컨트롤 플레인 프로바이더는 어차피 인프라 환경에 크게 종속되지 않는 경우가 많고 실제 자원을 제공하는 게 아니라 동작, 설치 작업을 수행하기 때문이다.
인프라 프로바이더는 Cluster API로 어떤 리소스가 생성됐을 때 실제로 물리 자원을 프로비저닝해 제공한다.
자원을 프로비저닝한다는 점에서 클라우드 벤더를 떠올리기 쉽다.
그러나 베어메탈 환경에서도 사용할 수 있는 몇 가지 프로바이더가 존재한다.
몇가지 예를 들자면,
- BYOH(Bring Your Own Host), K0smotron - 사전에 프로비저닝된 머신에 SSH로 접근해 노드로 활용(엄밀하게 프로비저닝해주는 건 아님..)
- CAPM3(Cluster Api Provider Metal3) - 찐 베어메탈 프로바이더!
- 오픈스택의 컴포넌트 중 하나인 Ironic 활용
- BMC(Baseboard Management Controller, 메인보드에 부착된 컨트롤러로, 하드웨어 상태 모니터링 및 관리 지원)와
Redish, IPMI, iDRAC 등의 프로토콜을 통해 통신하여 머신 관리
오픈스택 프로바이더도 있는데, 이 케이스는 순수 베어메탈이라 하기엔 애매하다 생각해 언급하지 않는다.
커스텀 리소스
그렇다면 클러스터 API에서 지원하는 커스텀 리소스는 무엇이며, 어떻게 각 프로바이더 별로 세부 설정을 할 수 있도록 하는가?
먼저 전체적인 리소스 구조도는 다음과 같이 표현할 수 있다.
여기에서 Cluster, Machine(초록색)은 Cluster API에서 제공하는 벤더 독립적인 순수한 추상체이다.
보다시피 Cluster API의 리소스는 Ref
필드를 통해 프로바이더들이 제공할 수 있는 세부 구현체 리소스를 참조한다.
(해당 사양을 구현하는 어떤 프로바이더가 와도 상관없기에 X라고 표현했다.)
각 리소스를 조금 더 세부적으로 살펴본다.
- Machine - 노드를 정의하는 리소스
- 인프라 프로바이더가 제공하는 XMachine 리소스를 참조해 원하는 스펙의 실제 자원 프로비저닝
- 부트스트랩 프로바이더가 제공하는 XConfig 리소스를 참조해 노드 기본 설정 및 커스텀 커맨드 실행
- Cluster - 클러스터에 대한 전체적인 정의를 내리는 리소스
- 인프라 프로바이더가 제공하는 XCluster 리소스를 참조해 클러스터의 메타데이터(리전, 전역 ssh 키 등), 전역 설정
- 컨트롤플레인 프로바이더가 제공하는 XControlPlane 리소스를 참조해 컨트롤 플레인 컴포넌트 설정
- 이때 컨트롤 플레인도 하나의 노드이기 때문에, Machine과 같이 XMachine, XConfig 설정
클러스터 리소스는 컨트롤 플레인 리소스를 명시하여 컨트롤 플레인을 설정한다.
그러나 데이터 플레인에 대해서는 오히려 의존 관계가 역전되어 머신 리소스가 클러스터 리소스를 참조하는 구조이다.
이러한 구조를 통해 하나의 클러스터에 하나의 컨트롤 플레인, 그러면서 여러 개의 데이터 플레인을 배치하는 설계가 가능하다.
위의 그림은 단일 마스터 노드, 단일 워커 노드를 두는 상태의 그림이다.
Cluster API는 당연히 여러 머신을 하나의 단위로 묶는 방법 역시 제공하고 있다.
이를 지원하는 Cluster API의 리소스가 바로 MachineDeployment이다.
이름과 같이 이 리소스는 쿠버네티스의 디플로이먼트와 똑같이 머신을 관리한다.
실제로 동작할 때도 디플로이먼트 - 레플리카셋 - 파드의 관계처럼 MachineDeployment - MachineSet - Machine의 구조를 가진다.
실제 참조하는 리소스는 템플릿 리소스인데, 양식은 사실 일반 구현체 리소스와 다를 게 없다.
대신 레플리카마다 실제 구현체 리소스가 생기도록 해주는 템플릿으로서 기능한다.
보다시피 마스터 노드를 여러 개 두고 싶을 때는 컨트롤 플레인 리소스에서 설정하면 된다.
예시로 Kubeadm 부트스트랩, 컨트롤플레인 프로바이더와 MicroVM 인프라 프로바이더를 이용한 구조도를 그려본다. 참고
ClusterResourceSet 리소스는 Cluster API에서 제공하는 리소스로, 클러스터를 구축하면서 바로 넣고 싶은 리소스들을 정의한다.
이를 통해 CNI, CSI 등 클러스터 운용에 필요한 리소스들을 바로 배치하여 클러스터를 사용 가능한 상태로 만들 수 있다는 장점이 있다.
Cluster API에서는 MachineHeathCheck와 같은 다른 여러 가지 순수 커스텀 리소스도 제공하고 있다.
공식 문서 자체로는 전체 커스텀 리소스에 대한 개괄적인 장표를 따로 제공하지 않는다.
대신 전체 리소스는 crd dev로 확인해볼 수 있으니 참고
이렇게 템플릿 리소스로 세팅하면 상위 리소스에서 replica를 세팅해 여러 개의 복제 마스터 노드, 워커 노드를 둘 수 있다.
운영 방법
이 문단부터는 Cluster API를 이용해 버전 업그레이드, 장애 처리를 하는 등의 다양한 운영 전략을 다룬다.
사용 흐름
로고와 같이 cluster api는 3개의 클러스터 개념을 사용하며 이 순서로 클러스터를 배치한다.
- Seed Cluster - 이후 클러스터를 배치하기 위한 초창기 클러스터로, 초기 작업에만 잠시 쓰기에 KIND를 써도 무방
- Management Cluster - 서브 클러스터를 관리할 관리용 클러스터로, seed 클러스터로부터 배치하여 cluster api는 완벽하게 모든 클러스터를 자신의 리소스로 관리하게 된다.
- Workload Cluster - 어플리케이션을 돌리고 운용할 클러스터.
관련 문서
EXPLAIN - 파생 문서
이름0 | related | 생성 일자 |
---|
기타 문서
Z0-연관 knowledge, Z1-트러블슈팅 Z2-디자인,설계, Z3-임시, Z5-프로젝트,아카이브, Z8,9-미분류,미완이름1 | 코드 | 타입 | 생성 일자 |
---|---|---|---|
클러스터 api 인프라 프로바이더 탐색 | Z8 | topic | 2025-06-23 14:53 |
참고
- 한글
- aws 프로바이더로 멀티테넌시 관리
- BYOH 사용법
- 영문